interface Bird {
  fly: boolean;
  sing: () => {};
}

interface Dog {
  fly: boolean;
  bark: () => {};
}

// 类型保护
// 类型断言的方式实现
function trainAnimal(animal: Bird | Dog) {
  if (animal.fly) {
    (animal as Bird).sing();
  } else {
    (animal as Dog).bark();
  }
}
// in 语法来做类型保护
function trainAnimal2(animal: Bird | Dog) {
  if ("sing" in animal) {
    // 类型保护
    animal.sing();
  } else {
    animal.bark();
  }
}
// 使用 typeof 语法来做类型保护
function add(first: string | number, second: string | number) {
    if (typeof first === 'string' || typeof second === 'string') {
        return `${first}${second}`;
    }
    return first + second
}
// 使用 instanceof 语法来做类型保护，这样只能使用 class 不能使用 interface 做类型约束
class NumberObj{
    count:number
}

function add2(first: object | NumberObj, second: object | NumberObj) {
    if (first instanceof NumberObj && second instanceof NumberObj) {
        return first.count + second.count
    }
    return 0;
}